package com.kong.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.kong.constant.MessageConstant;
import com.kong.dao.CheckGroupDao;
import com.kong.entity.PageResult;
import com.kong.pojo.CheckGroup;
import com.kong.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author yang2013
 * @data 2020/10/9 15:54
 */
@Service(interfaceClass = CheckGroupService.class)
public class CheckGroupServiceImpl implements CheckGroupService {
    @Autowired
    private CheckGroupDao checkGroupDao;


    @Transactional
     // dubbo2.6.0中事务引起的问题
    //缺少事务的添加
    @Override
    public void addCheckGroup(CheckGroup checkGroup, Integer[] checkItemIds) {
        int effectNum=checkGroupDao.addCheckGroup(checkGroup);
        if (effectNum<=0){
            throw new RuntimeException();
        }

        /**
         * 将检查组对应的检查项插入中间表
         */
        addRSList(checkGroup,checkItemIds);

    }

    /**
     * 添加中间表的信息
     * @param checkGroup
     * @param checkItemIds
     */
    private void addRSList(CheckGroup checkGroup,Integer[] checkItemIds) {
        if (checkItemIds.length>0 && checkItemIds!=null) {
            List<Map> mapList=new ArrayList<>();
            for (Integer checkItemId : checkItemIds) {
                Map map=new HashMap();
                map.put("checkItemId",checkItemId);
                map.put("checkGroupId",checkGroup.getId());
                mapList.add(map);
//                checkGroupDao.addRSCheckItemGroup(map);
            }
            checkGroupDao.addRSCheckItemGroup(mapList);
        }
    }

    /**
     * 删除检查项--判断外键关联
     * @param id
     */
    @Override
    public void deleteById(Integer id) {
        /*
        判断检查组检查项
         */
        int count=checkGroupDao.countByCheckGroupItemById(id);
        if (count>0){
            throw new RuntimeException(MessageConstant.DELETE_CHECKITEM_FAIL2);
        }
        /*
        判断检查组和套餐是否有关联
         */
        int count1=checkGroupDao.countBySetmealCheckGroupById(id);
        if (count1>0){
            throw new RuntimeException(MessageConstant.DELETE_CHECKGROUP_FAIL3);
        }
        checkGroupDao.deleteById(id);
    }

    /**
     * @param id
     * @return
     */
    @Override
    public Map findListById(Integer id) {
        Map map=new HashMap(16);
        CheckGroup checkGroup=checkGroupDao.findCheckGroupById(id);
        map.put("checkGroup",checkGroup);
        List<Integer> integerList=checkGroupDao.findCheckGroupItemById(id);
        map.put("integerList",integerList);
        return map;
    }

    @Override
    public PageResult findByPage(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage,pageSize);
        List<CheckGroup> checkGroupList=checkGroupDao.findByPage(queryString);
        //可以将使用page<> 接受数据库查询的结果 需要将数据库返回类型设置为page<CheckGroup> page是arrayList的子类
//        Page<CheckGroup> checkGroups=checkGroupDao.findByPage(queryString);
        PageInfo pageInfo=new PageInfo(checkGroupList);
        return new PageResult(pageInfo.getTotal(),checkGroupList);
    }

    @Override
    public List<CheckGroup> findAll() {
        return checkGroupDao.findAll();
    }

    /**
     * 更新检查组--需要使用事务进行控制
     * --返回检查组对应检查项的id
     * --删除检查组对应的检查项
     * @param checkGroup
     */
    @Override
    public void updateCheckGroup(CheckGroup checkGroup,Integer[] integers) {
        //删除原有的中间表中检查组对应的信息
        checkGroupDao.deleteRSByCheckGroupId(checkGroup.getId());
        //更新检查组的信息
        checkGroupDao.updateCheckGroup(checkGroup);
        //添加中间表信息
        addRSList(checkGroup,integers);
    }
}
